#ifndef SERIAL_PORT_H
#define SERIAL_PORT_H

#include <string>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <iostream>
#include <map>
#include <mutex>
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Float64.h>
#include <nlohmann/json.hpp>
#include <yaml-cpp/yaml.h>

class SerialPort {
public:
    SerialPort(const std::string& port, int baud_rate);
    ~SerialPort();

    bool openPort();
    void closePort();
    bool sendData(const std::string& data);
    bool sendBin(const char* data, int len);
    std::string receiveData(int timeout_ms = 1000);
    
    // MCU数据管理功能
    void initRos(ros::NodeHandle& nh);
    void processReceivedData(const std::string& data);
    bool extractPacketFromBuffer(std::string& buffer, std::string& packet);
    void updateMcuData();
    
    // JSON数据解析功能
    void parseJsonMessage(const std::string& jsonString);
    
    // 数据查询接口（保留用于内部使用）
    bool hasKey(const std::string& key) const;
    std::string getValue(const std::string& key) const;
    int getIntValue(const std::string& key) const;
    double getDoubleValue(const std::string& key) const;
    std::map<std::string, std::string> getAllData() const;

private:
    std::string port_;
    int baud_rate_;
    int fd_;
    
    // MCU数据存储
    std::map<std::string, std::string> mcuData_;
    mutable std::mutex dataMutex_;
    std::string receiveBuffer_;
    
    // ROS通信
    ros::Subscriber downstreamSub_;  // 接收下行数据
    std::map<std::string, ros::Publisher> stringPublishers_;  // 字符串类型话题发布器
    std::map<std::string, ros::Publisher> doublePublishers_;  // 数值类型话题发布器
    
    // 预定义的数据键和类型
    std::map<std::string, std::string> keyDataTypes_;  // 键对应的数据类型 ("string" 或 "double")
    
    void mcuCommandCallback(const std_msgs::String::ConstPtr& msg);
    void initializeDataTypes();
    void loadUpstreamConfig(const std::string& configFile);
    void createPublishers(ros::NodeHandle& nh);
    void publishUpstreamData(const std::string& key, const std::string& value);
};

#endif // SERIAL_PORT_H
